import cv2
import pywt
import numpy as np
from matplotlib import pyplot as plt
src = cv2.imread('img/girl.png', cv2.IMREAD_GRAYSCALE)
# 小波滤波（对噪声系数不是很大的图像有很好的效果）
# 选择db8的小波进行分解
coeffs = pywt.wavedec2(src, 'db8', level=4)
# 我们给了0.005 为域值，如果小于该竖直我们便认为其为噪声
threshold = 0.005 * np.max(np.abs(coeffs[0]))
for i in range(2, len(coeffs)):
   #滤波后返回的是numpy数组, 需要转换成元组, 否则无法重构信号
   # threshold 域值函数，并且为软，就是不知直接截断而是逐步去掉
   coeffs[i] = tuple(pywt.threshold(coeffs[i], threshold, mode='soft'))
# 这里是使用小波重构函数进行重构，就能得到图像了
dst = pywt.waverec2(coeffs, 'db8')
# 显示结果图像
plt.figure('DWT Filter')
plt.subplot(121), plt.imshow(src, cmap="gray")
plt.title("Src image"), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(dst, cmap="gray")
plt.title("Filter image"), plt.xticks([]), plt.yticks([])
plt.show()